#ifndef IBE_ANSYS_RST_READER_H_
#define IBE_ANSYS_RST_READER_H_

#include <Python.h>
#include <string>
#include <vector>

#include "IBE_Ansys_Export.h"
#include "IBE_DataInformationClasses.h"
#include "IBE_ObjectReader.h"

namespace ibe_ansys
{
    /**
     * @class IBE_AnsysRstReader
     * @brief 读取Ansys的rst文件，并用IBE_DataInformation存储数据信息
     * @author liupeng
     */
    class IBE_ANSYS_EXPORT IBE_AnsysRstReader : public ibe_common::IBE_ObjectReader
    {
    public:
        explicit IBE_AnsysRstReader( const char* file_name = "" );
        ~IBE_AnsysRstReader();
        IBE_TypeMacro( ibe_ansys, IBE_AnsysRstReader, ibe_common, IBE_ObjectReader );

        /**
          * @brief 读取文件
          */
        virtual void Update() override;

    protected:
        virtual void Initialize() override;
        virtual void InitData() override;

        /**
          * @brief 将Ansys的rst文件转换为VTK格式
          *
          * @param file_name 要转换的rst文件路径
          */
        virtual void ReadAnsysRst( const char* file_name );

        /**
        * @brief 获取一个临时文件的路径
        * @return 文件路径
        */
        virtual std::string GetTempFileNameOfRst();

        /**
         * @brief 获取对应属性数据的变量数据（不包含随时间步/分析步变化的变量数据，如stress）
         *
         * @param instance_py python类实例
         * @param data_type 数据类型："FieldData"/"PointData"/"CellData"
         * @return 存储变量数据
         */
        virtual std::vector<ibe_common::IBE_FieldData*> AnalyzeBaseArrayDataFromPythonInstance(
            PyObject* instance_py, const char* data_type );

        /**
         * @brief 解析变量信息
         *
         * @param array_dict 存储变量信息的字典（python格式）
         * @param data_type 数据类型："FieldData"/"PointData"/"CellData"
         * @return 变量信息
         */
        virtual ibe_common::IBE_FieldData* AnalyzeArrayFromPythonDict( PyObject* array_dict, const char* data_type );
        /**
         * @brief 解析网格集信息
         *   
         * @param components_list 存储网格集信息的列表
         * @param type 网格集类型：0-节点集/1-单元集
         * @return 对应网格集的内容
         */
        virtual std::vector<ibe_common::IBE_Block*> AnalyzeComponentsFromPythonDict( PyObject* components_list, const int type );

        /**
         * @brief 释放python空间
         */
        virtual void FreePyObjects();

    protected:
        //! 用于释放Python空间
        std::vector<PyObject*> pyObjects_;

    private:
        IBE_AnsysRstReader( const IBE_AnsysRstReader& ) = delete;
        IBE_AnsysRstReader& operator=( const IBE_AnsysRstReader& ) = delete;
    };

} // namespace ibe_ansys

#endif // IBE_ANSYS_RST_READER_H_